(function($) {
	/** 树形组件 */
	$.fn.tree = function(o, data) {
		if (typeof o == "string") {
			return $.fn.tree.methods[o](this, data);
		}
		var n = this;
		return this.each(function() {
			var d = $.data(this, "tree");
			if(d) {
			} else {
				d = $.data(this, "tree", o);
			}
			// 创建树
			var _tree = $("<ul/>").addClass("tree").appendTo(this);
			if(d.data) {
				addNode(this, _tree, d.data, 0);
			} else {
				$.ajax({
					type:'POST',
					dataType:"text",
					url:d.action,
					async:false,
					success:function(data) {
						d.data = getData(data);
					},
					dataType:'text' 
				});
				addNode(this, _tree, d.data, 0);
			}
		});
	};
	$.fn.tree.methods = {
		getSelected:function(o) {
			return $(o).data("selected");
		},
		onClick:function() {
			
		},
		onExpanded:function() {
			
		},
		onRefer:function() {
			
		},
		getSignlSelected:function(o, data) {
		},
		expanded:function(o) {
			
		},
		addNode:function() {
			
		},
		removeNode:function() {
			
		}
	};
	/** 创建树 */
	function addNode(tree, o, d, i) {
		var options = $.data(tree, "tree");
		var ajax = options.ajax;
		var checkbox = options.checkbox;
		$(d).each(function() {
			var x = this;
			var _d = this.data;
			var li = $("<li/>").appendTo(o);
			var div = $("<div/>").addClass("tree-node").appendTo(li);
			for(var j = 0;j < i; j++) {
				$("<span/>").addClass("tree-indent").appendTo(div);
			}
			if(ajax) {
				var bing = false;
				var node = x.node;
				if(node) {
					bing = true;
				}
				var _img = $("<span/>").addClass("tree-collapsed").appendTo(div);
				_img.bind({"click":function() {
					var c = $(this).attr("class");
					if(c == 'tree-collapsed') {
						$(this).attr("class", "tree-expanded");
						$(this).next().addClass("tree-folder-open");
						$(this).parent().next().css("display", "block");
						if(ajax) {
							var action = options.action;
							$(li).children("ul").remove();
							if(!bing) {								
								$.post(action, x, function(data) {
									var ul = $("<ul/>").css({"display":"block"}).appendTo(li);
									addNode(tree, ul, data, i+1);
								}, "json");
							}
						}
					} else {
						$(this).attr("class", "tree-collapsed");
						$(this).next().removeClass("tree-folder-open");
						$(this).parent().next().css("display", "none");
					}
				}});
				var _ico = $("<span/>").addClass("tree-folder").appendTo(div);
			} else {
				if(_d && (_d.length) > 0) {
					var _img = $("<span/>").addClass("tree-collapsed").appendTo(div).bind({"click":function() {
						var c = $(this).attr("class");
						if(c == 'tree-collapsed') {
							$(this).attr("class", "tree-expanded");
							$(this).next().addClass("tree-folder-open");
							$(this).parent().next().css("display", "block");
						} else {
							$(this).attr("class", "tree-collapsed");
							$(this).next().removeClass("tree-folder-open");
							$(this).parent().next().css("display", "none");
						}
					}});
					var _ico = $("<span/>").addClass("tree-folder").appendTo(div);
					// 如果子节点存在，且长度大于零。
					var ul = $("<ul/>").css({"display":"none"}).appendTo(li);
					addNode(tree, ul, _d, i+1);
				} else {
					var _img = $("<span/>").addClass("tree-indent").appendTo(div);
					var _ico = $("<span/>").addClass("tree-file").appendTo(div);
				}
			}
			var _count = 0;
			if(checkbox) {
				_count = x.count;
				if(_count == 0) {				
					var chbox = $("<span/>").addClass("tree-title").appendTo(div);
					var input = $("<input/>").data("data", x).attr("type", "checkbox").attr("name", "_chbox").appendTo(chbox);
					input.bind({"change":function() {
						if(this.checked) {
							$(this).attr("sel", "1");
						} else {
							$(this).attr("sel", "");
						}
					}});
				}
			}
			var _title = $("<span/>").addClass("tree-title").appendTo(div).bind({"click":function() {
				var _tree = $.data(tree, "tree");
				if(_tree.selected) {
					var s = $(this).attr("class");
					if(s == "tree-title") {
						$(this).addClass("tree-node-selected");
					} else {
						$(this).removeClass("tree-node-selected");
					}
					var _selectedNode = $(tree).find("span.tree-node-selected");
					var array = new Array();
					$(_selectedNode).each(function(i) {
						var n = $(this).data("node");
						array[i] = n;
					});
					$(tree).data("selected", array);
				} else {
					$(".tree-title").removeClass("tree-node-selected");
					$(this).addClass("tree-node-selected");
					$(tree).data("selected", x);
				}
				var m = options.onClick;
				options.onClick.call(m, x);
			}});
			if(!this.request) {
				_title.html(this.name);
			} else {
				var _a = $("<a/>").html(this.name).appendTo(_title);
				_a.attr("href", this.request);
				if(this.target) {
					_a.attr("target", this.target);
				}
			}
			$(_title).data("node", x.id);
		});
	};
})(jQuery);